Android Intent重新回顾

Android基础回顾之Intent

Intent是我们在开发中最经常用到的工具之一,不仅是各大组件内通信的工具,还是组件间交互的重要媒介。在平时开发的过程中可能很熟悉Intent的用法了,但有些细节可能会在开发中被忽略。

我们最常使用Intent都是在Activity交互时使用的,在我平时开发需求的过程中,90%都是这么用的:

1
2
Intent intent = new Intent(...);
startActivity(intent);

所以Intent的其他不常用的东西忘的都差不多了,是时候来回顾一下咯

Intent的属性

大家都知道显示和隐式启动Activity的方式,隐式启动用的少,重新熟悉一下咯。

component

component用来接收跳转Activity的信息,把需要跳转的两个Activity信息放入component中就能显式启动Activity.不过我平时都不用这个东西,就如上面写的,直接把Activity丢到Intent的构造函数里就好了。mark一下有这东西的存在免得哪天有人问。对了,还有一点,component还能记录当前Activity的包名类名啥的信息哟。

Action Category&& intent-filter

这三者配合就是隐式召唤Activity的利器,你懂的。
我是老记不住这三者怎么配合使用,以前看的时候立马懂了。过两天没写又忘光了一些细节,还是细节重要。

Action很简单,系统自带一些Action就不说了,自定义Action建一个局部变量就ok

1
2
3
public static final String MYACTION = "com.qunar.flight.lycc.action";
intent.setAction(MYACTION);
startActivity()...

然后就是在Manifest中配置intent-filter了。这个谁都会啦,有什么好讲的。。。。无聊嘛,写着玩咯,写多了就记住了

intent-filter中可以包含如下内容:

  • 0-N个action
  • 0-N个category
  • 0-1个data

当Activity的intent-filter里有多少action它就能响应其中任意一个包含该action name的intent

而category嘛,匹配规则就是一一对对应了,intent的category和intent-filter的category必须100%对应上才能正常启动,intent自带 default category,所以写了
intent-filter就必须包含default category,比如我们的MainActivity,intent-filter就带了个default,你可以试试删了它看能不能玩

data和type

data是用来给Action提供数据的,一般都是传入一个Uri对象格式如下

1
scheme://host:port/path

还一个就是type属性,是用来指定data属性的MIME类型的,支持自定义,格式如下:

1
abc/xyz

data和type会覆盖

  • 如果为Intent先设置data后设置type,type覆盖data,反之同反
  • 如果希望Intent data和type都有,需要用setDataAndType()方法

关于这部分的匹配内容,真是懒得写了,太绕了,道理却又很简单,总结一下优先级和必要性就能记住了,用的时候在网上查吧,这东西用的少记住了也没啥卵用。

最后在记一个问题,就是intent的flag,面试过Android的同学估计90%都被问过这个问题,太无聊了
开头都是FLAGACTIVITY,我就省略了

  • BROUGHT_ TO_FRONT,见名知意,如果某activity已经启动过了,用这中方式调起则直接弹出到栈顶,比如A先启动了,后来又有B,C,下次再启动A就是B,C,A
  • CLEAR_TOP 自带Single_top,例如栈内有ABCD,这时候启动B,则栈内为AB,CD被弹出来了
  • NEW_TASK 默认启动标注,总是重新创建一个新的
  • NO_ANIMATION 启动不带动画哦
  • NO_HISTORY 用这个东西启动的Activity不会留在栈里,例如现有ABC,用这种方式启动D,然后再普通启动E,这时栈内只有ABCE,D被E取代了不保留,及时你没调用finish方法。
  • SINGLE_TOP 栈内只能有一个相同的,比如ABCD,再启动一个D,还是ABCD
Maydaaa wechat
欢迎添加微信好友共同交流学习!
坚持原创技术分享,您的支持将鼓励我继续创作!